#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>

int main()
{
    printf("我是一个父进程：pid: %d, ppid: %d\n", getpid(), getppid());

    pid_t id = fork();
    if(id < 0)
    {                                                                          
        perror("fork");
        exit(1);
    }
    else if(id == 0)
    {
        // child
        int cnt = 3;
        while(cnt--)
        {
            printf("I am a child process: pid: %d, ppid: %d\n", getpid(), getppid());
            sleep(1);
        }
        exit(10);
    }
    else
    {
        while(1)
        {
            int status = 0;
            pid_t rid = waitpid(id, &status, WNOHANG); // 非阻塞检测&&回收     
            if(rid > 0)
            {
                printf("wait success! 退出的子进程的pid是：%d, exit_code: %d\n", rid, WEXITSTATUS(status));
                break;
            }
            else if(rid == 0)
            {
                printf("子进程正在运行，父进程还需要等待\n");
                usleep(200000);
            }
            else
            {
                perror("waitpid");
                break;
            }
        }
        
            

        //int status = 0;
        //// 父进程阻塞等待
        //pid_t rid = waitpid(id, &status, 0);
        //if(rid > 0)
        //{
        //    int exit_code = (status >> 8) & 0xFF;
        //    int exit_sig = status & 0x7F;
        //    printf("wait success, 退出的子进程的pid是：%d, exit_code: %d, exit_sig: %d\n", rid, exit_code, exit_sig);
        //
        //    //if(WIFEXITED(status)) // 判断进程是否正常退出，即信号是否为0
        //    //{
        //    //    printf("wait success! 退出的子进程的pid是：%d, exit_code: %d\n", rid, WEXITSTATUS(status));
        //    //}
        //    //else
        //    //{
        //    //    printf("子进程是异常退出的\n");
        //    //}
        //}
        //else
        //{
        //    printf("rid: %d\n", rid);
        //    perror("wait failed");
        //}
    }
}


//int main()
//{
//    printf("I am parent process, pid: %d, ppid:%d\n", getpid(), getppid());
//
//    pid_t id = fork();
//    if(id == 0)
//    {
//        // child
//        int cnt = 5;
//        while(cnt)
//        {
//            printf("I am child process, pid: %d, ppid:%d, cnt: %d\n", getpid(), getppid(), cnt);
//            sleep(1);
//            cnt--;
//        }                                                                    
//        exit(0);
//    }
//    // parent
//    int status = 0;
//    pid_t rid = waitpid(id, &status, 0);
//    if(rid == id)
//    {
//        int exit_code = (status >> 8) & 0xFF; // 1111 1111
//        int exit_sig = status & 0x7F; // 0111 1111
//        printf("pid: %d, wait success!, status: %d, exit_code: %d, exit_sig: %d\n", getpid(), status, exit_code, exit_sig);
//    }
//
//   return 0;
//}

//#include <stdio.h>
//#include <unistd.h>
//#include <stdlib.h>
//#include <sys/types.h>
//#include <sys/wait.h>
//
//int main()
//{
//    pid_t id = fork();
//    if(id == 0)
//    {
//        int cnt = 5;
//        while(cnt--)
//        {
//            printf("I am child process, pid: %d\n", getpid());
//            sleep(1);    
//           
//        }    
//        exit(0); // 终止子进程     
//    }    
//    else if(id > 0)    
//    {    
//            
//        // 回收子进程，等待僵尸 
//        pid_t rid = wait(NULL); 
//        if(rid == id)
//        {
//            printf("wait success, child process pid: %d\n", rid);
//        }
//        else
//        {
//            printf("wait failed\n");
//        }
//        sleep(2);
//        exit(0);
//    }
//}


//#include <stdio.h>
//#include <unistd.h>
//
//int main()
//{
//    while(1)
//    {
//        printf("hello linux, pid: %d\n", getpid());
//        sleep(1);
//    }
//    return 0;
//}

//#include <stdio.h>
//#include <string.h>
//
//int main()
//{
//    int i = 0;
//    for(; i < 200; ++i)
//    {
//        printf("%d->%s\n", i, strerror(i));
//    }
//}

//#include <stdio.h>
//
//int main()
//{
//    printf("hello linux\n");
//    return 0;
//}

//#include <stdio.h>
//#include <unistd.h>
//#include <stdlib.h>
//
//int main()
//{
//    int i = 0;
//    for(; i < 5; ++i)
//    {
//        pid_t id = fork();
//        if(id == 0)
//        {
//            // child
//            int cnt = 5;
//            while(cnt--)
//            {
//                printf("I am child process, pid: %d, ppid: %d, cnt: %d\n", getpid(), getppid(), cnt);
//                sleep(1);
//            }
//            exit(0);
//        }
//
//    }
//
//    sleep(100);
//
//    return 0;
//}
